// wifi_prov_manager.h
#ifndef WIFI_PROV_MANAGER_H
#define WIFI_PROV_MANAGER_H

#include "system/includes.h"

#ifdef __cplusplus
extern "C" {
#endif

// syscfg 自定义ID
#define WIFI_PROV_CFG_ID 0x002

// 配网标志
#define WIFI_PROV_MAGIC_NORMAL 0x000000AB    // 正常启动（STA）
#define WIFI_PROV_MAGIC_NEED_PROV 0x0000AB01 // 进入AP配网
#define WIFI_PROV_MAGIC_FACTORY 0x0000ABFF   // 恢复出厂（清空后走配网）

typedef struct
{
    u32 magic;
    char ssid[64];
    char pwd[64];
    u32 crc;
} wifi_prov_nv_t;

typedef enum
{
    WIFI_PROV_DESIRED_NONE = 0,
    WIFI_PROV_DESIRED_AP,
    WIFI_PROV_DESIRED_STA,
} wifi_prov_desired_mode_t;

// 由上层(app/wifi_app_task)注入的“平台操作”，保持解耦
typedef struct
{
    // AP已启动时，初始化LAN/DHCP/DNS（如需）
    void (*ap_net_init)(void);
    // 启动/停止配网HTTP服务器（如需）
    void (*prov_server_start)(void);
    void (*prov_server_stop)(void);
    // 存储STA信息（可直接封装wifi_store_mode_info）
    void (*store_sta_info)(const char *ssid, const char *pwd);
    // 重启（如不提供，模块用弱实现）
    void (*reboot)(void);
    // 配网完成通知（结果：0/非0）
    void (*on_finished)(int result);
    // 可选：日志/诊断回调
    void (*log)(const char *fmt, ...);
} wifi_prov_ops_t;

// 初始化：只做本地状态和NV装载，不操作WiFi，不注册事件
int wifi_prov_manager_init(const wifi_prov_ops_t *ops);

// 读取并决定启动模式（根据NV），返回建议模式；由上层在 WIFI_EVENT_MODULE_INIT 中决定并调用 wifi_set_default_mode(...)
wifi_prov_desired_mode_t wifi_prov_manager_get_desired_mode(void);

// 在系统启动流程很早时调用一次，装载NV（可重复调用，幂等）
int wifi_prov_nv_load(wifi_prov_nv_t *out);

// 上层在自己的 WiFi 事件回调里转发事件给本模块（模块内部不会注册回调）
int wifi_prov_manager_on_event(enum WIFI_EVENT event, void *arg);

// 服务器侧拿到凭据后调用（上层把HTTP server的 on_credentials 转发到这里）
int wifi_prov_manager_on_credentials(const char *ssid, const char *pwd, int save);

// 触发进入配网并重启（只写NV，真正重启由ops->reboot或弱实现）
int wifi_prov_trigger_ap_and_reboot(void);

// 恢复出厂并重启（清SDK存储+清本地NV后置配网码），真正重启由ops->reboot或弱实现
int wifi_prov_factory_reset_and_reboot(void);

// 在确认成功时，写入最终凭据+置NORMAL（是否立即重启由上层决定）
int wifi_prov_set_final_sta_and_normal_boot(const char *ssid, const char *pwd);

// 弱符号：重启（上层可通过ops->reboot覆盖）
void wifi_prov_reboot(void) __attribute__((weak));

#ifdef __cplusplus
}
#endif
#endif